/**
 * 数组深拷贝比较工具函数
 */

/**
 * 深拷贝比较两个数组是否一样
 * @param arr1 第一个数组
 * @param arr2 第二个数组
 * @returns 是否相等
 */
export const deepCompareArrays = (arr1: any[], arr2: any[]): boolean => {
  if (arr1.length !== arr2.length) {
    return false;
  }

  // 使用 JSON.stringify 进行深拷贝比较
  return JSON.stringify(arr1) === JSON.stringify(arr2);
};

/**
 * 更高效的深拷贝比较（适用于对象数组）
 * @param arr1 第一个数组
 * @param arr2 第二个数组
 * @param keyFields 要比较的关键字段
 * @returns 是否相等
 */
export const deepCompareArraysOptimized = (
  arr1: any[],
  arr2: any[],
  keyFields: string[] = [],
): boolean => {
  if (arr1.length !== arr2.length) {
    return false;
  }

  // 如果指定了关键字段，只比较这些字段
  if (keyFields.length > 0) {
    return arr1.every((item1, index) => {
      const item2 = arr2[index];
      return keyFields.every((key) => item1[key] === item2[key]);
    });
  }

  // 否则进行完整的深拷贝比较
  return JSON.stringify(arr1) === JSON.stringify(arr2);
};

/**
 * 递归深拷贝比较（适用于复杂对象）
 * @param obj1 第一个对象
 * @param obj2 第二个对象
 * @returns 是否相等
 */
export const deepEqual = (obj1: any, obj2: any): boolean => {
  // 基本类型比较
  if (obj1 === obj2) return true;

  // null 和 undefined 比较
  if (obj1 == null || obj2 == null) return obj1 === obj2;

  // 类型比较
  if (typeof obj1 !== typeof obj2) return false;

  // 数组比较
  if (Array.isArray(obj1) && Array.isArray(obj2)) {
    if (obj1.length !== obj2.length) return false;
    return obj1.every((item, index) => deepEqual(item, obj2[index]));
  }

  // 对象比较
  if (typeof obj1 === 'object') {
    const keys1 = Object.keys(obj1);
    const keys2 = Object.keys(obj2);

    if (keys1.length !== keys2.length) return false;

    return keys1.every(
      (key) => keys2.includes(key) && deepEqual(obj1[key], obj2[key]),
    );
  }

  return false;
};
